using namespace std;
#include <iostream>
#include <unistd.h>

// spdlog : 高性能日志库，支持异步化，多线程安全，灵活的刷新策略
// 多平台支持，接口丰富
// 自定义格式
/*
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/async.h>
#include <spdlog/sinks/basic_file_sink.h>
*/

#include"logger.hpp"
#include<gflags/gflags.h>

DEFINE_bool(mode, false, "mode == false 调式模式；否则 发布模式");
DEFINE_string(logger_name, "logger", "日志器名");
DEFINE_string(logfile_path, "./example.log", "日志文件路径");
DEFINE_int32(level, 0, "日志等级");
DEFINE_bool(truncate, false, "是否在重启时清空源日志文件");

int main(int argc, char* argv[])
{
    /*
    try
    {

        // 设置全局日志等级 (控制输出)
        spdlog::set_level(spdlog::level::debug); // debug 及其以上等级才会输出
        // 设置全局刷新策略(按照 时间间隔 或者 日志条数)
        spdlog::flush_every(std::chrono::seconds(2)); // 2秒刷新一次
        spdlog::flush_on(spdlog::level::err);         // 设置遇到某个日志等级立即刷新
        // 设置全局自定义格式
        spdlog::set_pattern("[%H:%M:%S][%l] %v");

        // 创建 日志器,返回智能指针 (全局函数模板)
        // （同步）
        // auto logger = spdlog::stdout_color_mt("logger");
        // auto logger = spdlog::basic_logger_mt("logger", "./example.log");

        //异步
        spdlog::init_thread_pool(4096, 1); //条数和线程数
        // auto logger = spdlog::stdout_color_mt<spdlog::async_factory>("logger");
        auto logger = spdlog::basic_logger_mt<spdlog::async_factory>("logger", "./example.log");


        // 同样可以设置日志等级和刷新策略
        logger->set_level(spdlog::level::trace);
        logger->set_pattern("[%t][%n][%Y/%m/%d %H:%M:%S][%l] %v");

        logger->trace("测试日志1");
        logger->debug("测试日志{}", 2); // {} 表示占位符，支持基本类型
        logger->info("测试日志3");
        logger->warn("测试日志4");
        logger->error("测试日志5");
        logger->critical("测试日志6");

        //释放
        spdlog::drop("logger");//或者 spdlog::drop_all()
    }
    catch (const spdlog::spdlog_ex &ex)
    {
        cout << ex.what() << endl;
    }

    sleep(10);
    */

    google::ParseCommandLineFlags(&argc, &argv, true);

    init_mylogger(FLAGS_mode, FLAGS_logger_name, FLAGS_logfile_path, FLAGS_level, FLAGS_truncate);
    LOG_DEBUG("测试日志1");
    LOG_TRACE("测试日志{}", 2);
    LOG_INFO("测试日志3");
    LOG_WARN("测试日志4");
    LOG_ERROR("测试日志5");
    LOG_FATAL("测试日志6");
    
    google::ShutDownCommandLineFlags();
    return 0;
}